package com.zhku.shoppingspringboot.utils;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.serializer.SerializerFeature;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Serializable;
import java.nio.charset.StandardCharsets;
import java.nio.file.Files;
import java.util.Arrays;
import java.util.List;
@Slf4j
public class FileUtils {

    public static String upLoadImg(String uploadDir, String oldPath, MultipartFile file) {
        // 检查文件类型和文件是否为空
        if (!isImageType(file)) {
            return "-1";
        }
        File directory = new File(uploadDir);
        // 如果存放的文件夹不存在，则创建该文件夹
        if (!directory.exists()) {
            log.error(directory + "directory not exists");
            directory.mkdirs();
        }
        // 创建新的图片存储路径，文件名是随机字符串（8位）
        // 获取文件后缀名,正则表达式中  .匹配任意字母所以需要\\.
        String[] split1 = file.getOriginalFilename().split("\\.");
        String suffix = "";
        if (split1.length > 1) {
            suffix = split1[split1.length - 1];
        }
        String fileName = RandomStringGenerator.generateRandomString(8) +"."+suffix;
        String filePath = uploadDir + fileName;
        File tarFile = new File(filePath);
        // 如果存在就重新生成
        while (tarFile.exists()) {
            fileName = RandomStringGenerator.generateRandomString(8) + suffix;
            filePath = uploadDir + fileName;
            tarFile = new File(filePath);
        }
        try {
            // 保存文件到服务器
            file.transferTo(tarFile);
        } catch (IOException e) {
            return "-2";
        }
        if (!(oldPath == "" || oldPath == null)) {
            // 删除旧图片
            String[] split = oldPath.split("/");
            String oldFileName = "";
            if (split.length > 0) {
                oldFileName = split[split.length - 1];
            }
            File oldFile = new File(uploadDir + oldFileName);
            if (oldFile.exists()) {
                oldFile.delete();
            }
        }
        return fileName;
    }


    private static boolean isImageType(MultipartFile file) {
        // 检查文件是否为空
        if (file.isEmpty()) {
            return false;
        }
        // 检查 MIME 类型
        String contentType = file.getContentType();
        if (contentType != null && contentType.startsWith("image/")) {
            return true;
        }

        // 检查文件扩展名
        String filename = file.getOriginalFilename();
        if (filename != null) {
            String extension = filename.substring(filename.lastIndexOf('.') + 1).toLowerCase();
            return Arrays.asList("jpg", "jpeg", "png", "gif", "bmp", "tiff", "svg", "webp").contains(extension);
        }

        return false;
    }

    /**
     * 将任意List对象以JSON形式保存到文件中。
     * @param data 要保存的List对象，使用多态，可以是任何类型的List。
     * @param filePath 文件路径。
     * @param <T> List中元素的类型。
     * @return 是否保存成功。
     */
    public static <T> boolean saveListAsJsonToFile(List<T> data, String filePath) {
        if (data == null || filePath == null) {
            return false;
        }
        try {
            // 使用fastjson将List转换为JSON字符串
            String json = JSON.toJSONString(data, SerializerFeature.PrettyFormat, SerializerFeature.WriteMapNullValue);
            // 创建文件
            File file = new File(filePath);
            if (!file.getParentFile().exists()) {
                // 如果父目录不存在，则创建
                file.getParentFile().mkdirs();
            }
            // 写入文件
            try (FileWriter writer = new FileWriter(file)) {
                writer.write(json);
            }

            return true;
        } catch (IOException e) {
            log.error("出现IO异常");
            return false;
        }
    }
    /**
     * 从JSON文件中读取数据并转换为指定的Java对象。
     *
     * @param <T> 目标对象的类型
     * @param filePath JSON文件路径
     * @param clazz 目标对象的类类型
     * @return 转换后的Java对象
     */
    public static <T extends Serializable> T readJsonFile(String filePath, Class<T> clazz) {
        try {
            // 读取整个文件内容到一个字符串
            String content = new String(Files.readAllBytes(new File(filePath).toPath()), StandardCharsets.UTF_8);
            // 直接将BufferedReader传递给fastjson的parseObject方法
            T data = JSON.parseObject(content,clazz);
            return data;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }
    }

}
